home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 June / EnigmA AMIGA RUN 08 (1996)(G.R. Edizioni)(IT)[!][issue 1996-06][EARSAN CD VII].iso / docs / corsoguide / exec-5.txt < prev    next >
Text File  |  1992-09-03  |  6KB  |  106 lines

  1. Exec
  2.  
  3. Exec stà per System Executive vale a dire Sistema Esecutivo che, come
  4. si può intuire dal nome si occupa di gestire completamentamente la
  5. macchina; l'exec.library mette a disposizione una serie di funzioni per
  6. sfruttare l'exec (creazione di task, interrupt, comunicazioni ecc.); dato
  7. che queste operazioni sono molto importanti e che verranno utilizzate molto
  8. spesso, è giusto che vengano analizzate quì, prima di entrare nel vivo
  9. della programmazione su Amiga.
  10. La prima caratteristica da analizzare è
  11. l'allocazione dinamica della memoria; dato che l'Amiga è un sistema
  12. Multitasking e che tutte le strutture gestite sono dinamiche (cioè possono
  13. venire allocate e utilizzate in un qualsiasi momento) non si può pretendere
  14. che i programmi o i dati vengano a trovarsi in indirizzo fissi di memoria
  15. (dato che in quello spazio potrebbe essere presente un qualsiasi altro
  16. dato, creato da un altro programma), per cui ogni qualvolta che necessita
  17. utilizzare memoria occorre chiederla al sistema operativo il quale, tramite
  18. una lista interna provvederà ad allocarne la quantità richiesta e a
  19. fornirne l'indirizzo. Vi è un altro modo per allocare spazi di memoria da
  20. utilizzare nei programmi: tramite la dichiarazione delle variabili del C;
  21. si badi bene però che questo corrisponde a spazio fisico occupato dal
  22. codice, per cui se si dichiara un vettore di 250K, l'eseguibile sarà
  23. allungato di appunto 250K introducendo così, un'inutile spreco di spazio su
  24. supporto magnetico. La funzione dell'exec.library che si occupa
  25. dell'allocazione di memoria è AllocMem ed ha la seguente sintassi:
  26.  
  27. BloccoMem = AllocMem(NumBytes,attributi);
  28.  
  29. Dove 'NumBytes' indica la lunghezza in bytes del blocco di memoria;
  30. 'attributi' indicano che tipo di memoria allocare e come deve essere
  31. allocata; 'attributi' può valere:
  32. MEMF_CHIP, indica che il tipo di memoria deve essere CHIP
  33. MEMF_FAST, la memoria deve essere FAST
  34. MEMF_ANY, la memoria può essere di qualsiasi tipo, in tal caso avrà
  35.           precedenza la FAST, se questa non fosse disponibile si provvederà
  36.           per la CHIP
  37. MEMF_PUBLIC, questo flag indica che la memoria è di tipo pubblico può cioè,
  38.              essere condivisa fra più task (questa caratteristica non è
  39.              ancora implementata, il flag è stato inserito per usi futuri)
  40. MEMF_CLEAR, utilizzando questo flag si cancella tutto il blocco di memoria
  41.             prima che venga messo a disposizione del programma
  42. MEMF_24BITDMA, (dalla verione 37 del S.O.) indica che il blocco di memoria
  43.                verrà allocato nei primi 24 bit di indirizzo; questo poiché
  44.                alcune schede Zorro II (che supporta solo 24 bit indirizzo
  45.                perché creato con A2000 che sfruttava tali bit a causa del 
  46.                68000) potrebbero fare uso di memoria e quindi non possono
  47.                "vedere" memoria al di fuori dei succitati 24 bit.
  48. MEMF_REVERSE (V37), dato che nella ricerca del blocco di memoria richiesto
  49.                     si procede a partire dagli indirizzi più bassi,
  50.                     attivando questo flag si procede dall'indirizzo più alto
  51.                     (le applicazioni che si osservano sovente sono i
  52.                     caricatori dei S.O. in RAM che selezionano l'indirizzo
  53.                     più alto)
  54. vi sono altri flag meno importanti per i quali si rimanda ai doc delle
  55. funzioni; 'BloccoMem' è il puntatore al blocco di memoria allocato ritornato
  56. dalla funzione, o NULL se non è stato possibile allocare il blocco, per cui
  57. ricordatevi di controllare sempre il valore restituito da tale funzione; vi
  58. assicuro che scrivere dati all'indirizzo 0 che corrisponde a NULL, porta
  59. probabilmente al cosiddetto GURU pittoresco riconoscibile non dalla solita
  60. scritta lampeggiante, ma da una serie di effetti video colorati (un Amiga si
  61. deve riconoscere anche quando si blocca); esempi:
  62.  
  63. UBYTE *buffer;
  64.    .
  65.    .
  66. if ((buffer = (UBYTE *)AllocMem(10000,MEMF_CLEAR)) == NULL)
  67.   printf("Errore non posso allocare buffer\n");
  68. /* Alloca 10000 bytes di qualsiasi tipo e cancellali */
  69.    .
  70. if ((buffer = (UBYTE *)AllocMem(5000,MEMF_CHIP|MEMF_CLEAR)) == NULL)
  71.   printf("Errore non posso allocare buffer\n");
  72. /* Alloca 5000 bytes di memoria chip con cancellazione */
  73.  
  74. In entrambi gli esempi se non è possibile allocare i buffer verrà
  75. segnalato errore; ovviamente non bisogna indicare contemporaneamente flag
  76. in conflitto come MEMF_CHIP e MEMF_FAST. E qui si reincontra la prima
  77. regola dell'Amiga: "tutto ciò che viene allocato dovrà essere deallocato"
  78. per cui eccovi la funzione di exec che vi permette di resituire al sistema
  79. il blocco di memoria allocato, una volta che non ne avete più bisogno:
  80.  
  81. FreeMem(BloccoMem,NumBytes);
  82.  
  83. 'BloccoMem' è il puntatore al blocco restituito da AllocMem e NumBytes la
  84. lunghezza di quest'ultimo in bytes; attenzione a non fornire un numero
  85. diverso da quello utilizzato per l'allocazione, non fornire un puntatore
  86. errato o non tentare di deallocare due volte lo stesso buffer, altrimenti
  87. andrete incontro ad un guru; esempio:
  88.  
  89. FreeMem(buffer,10000);
  90. /* Deallocazione del buffer del primo esempio */
  91.  
  92. Dalla V36 del s.o. è disponibile una funzione di allocazione e una
  93. di deallocazione della memoria che ricorda la lunghezza del blocco
  94. allocato, per cui non vi è bisogno di indicarlo nella liberazione di
  95. quest'ultimo; il funzionamento di queste funzioni è identico alle
  96. corrispettive già esaminate:
  97.  
  98. BloccoMem = AllocVec(NumBytes,attributi);
  99.  
  100. FreeVec(BloccoMem);
  101.  
  102. Non tentate di utilizzare AllocMem con FreeVec o viceversa riguardo ad
  103. uno stesso blocco; ad una AllocMem deve corrispondere una FreeMem e ad una
  104. AllocVec una FreeVec. Vi sono altre funzioni per la gestione della memoria
  105. come conoscere la quantità disponibile o altre che potrete trovare nei doc.
  106.